home *** CD-ROM | disk | FTP | other *** search
- /*
- * macintalk driver
- */
- #define _DRIVER
- #include <memory.h>
- #include <pb.h>
- #include <resource.h>
- #include "speech.h"
-
- #define NULL 0L
-
- struct pbRec {
- struct ParamBlkRec * ioLink;
- short ioType;
- short ioTrap;
- Ptr ioCmdAddr;
- ProcPtr ioCompletion;
- short ioResult;
- char * ioNamePtr;
- short ioVRefNum;
- union {
- struct ioParam iop;
- struct cntrlParam cp;
- } u;
- };
-
- /*
- * Internal format of the SpeechRecord structure
- */
- struct iSpeechRecord {
- struct pbRec pb; /* 50 bytes */
- int junk0; /* 50 */
- ProcPtr * rdrH0; /* 52 */
- long junk4; /* 56 */
- Str255 * ExcpFile; /* 60 */
- int junk6; /* 64 */
- ProcPtr * rdrHandle; /* 66 */
- int DrvrRefNum; /* 70 */
- int junk2; /* 72 */
- int ExcpRefNum; /* 74 */
- char junk1[24]; /* 76 */
- };
- typedef struct iSpeechRecord iSpeechRecord;
- typedef iSpeechRecord * iSpeechPtr;
- typedef iSpeechPtr * iSpeechHandle;
-
- /* Driver Control Codes */
- #define MODE_CODE 0
- /* Code 1 for language maybe? */
- #define RATE_CODE 2
- #define SEX_CODE 3
- #define PITCH_CODE 4
-
-
- #define uTableBase ((long*)0x011c)
-
- SpeechErr SpeechOn( ExcpsFile, ptheSpeech )
- Str255 * ExcpsFile;
- SpeechHandle * ptheSpeech;
- {
- static char * DrvrName = "\P.SPEECH";
- static char * DrvrFile = "\PMacinTalk";
- register iSpeechHandle theSpeech;
- register iSpeechPtr isp;
- register int refNum;
- register Handle h;
- register long * utp;
- register int id;
- register OSErr err;
-
-
- * ptheSpeech = theSpeech
- = NewHandle(( Size )( sizeof( iSpeechRecord )));
- if( err = MemError())
- return err;
- HLock( theSpeech );
- isp = *theSpeech;
- setmem( isp, sizeof( iSpeechRecord ), 0 );
- if(( refNum = OpenResFile( DrvrFile )) < 0 )
- return ResError();
- isp->ExcpRefNum = refNum;
- SetResLoad( FALSE );
- h = GetNamedResource( 'DRVR', DrvrName );
- if( err = ResError())
- return err;
- SetResLoad( TRUE );
-
- utp = uTableBase;
- utp = &(utp[32]);
- id = 32;
- do {
- --id;
- if( id<= 18 )
- return fullUnitT;
- } while( *--utp );
- isp->DrvrRefNum = -(id+1);
-
- SetResInfo( h, id, NULL );
- LoadResource( h );
- /* err = ResError(); */
- HLock( h );
-
- isp->ExcpFile = ExcpsFile;
- isp->pb.ioNamePtr = DrvrName;
- isp->pb.ioVRefNum = 0;
- isp->pb.u.iop.ioVersNum = 0;
- isp->pb.u.iop.ioPermssn = 0;
- isp->pb.u.iop.ioMisc = NULL;
- PBOpen( isp, FALSE );
- err = isp->pb.ioResult;
- isp->rdrHandle = isp->rdrH0;
- HUnlock( theSpeech );
- return err;
- }
-
-
- void SpeechOff( theSpeech )
- SpeechHandle theSpeech;
- {
- register iSpeechPtr isp;
- register int excpRef;
-
- HLock( theSpeech );
- isp = *( iSpeechHandle )theSpeech;
- PBClosei( isp );
- if( excpRef = isp->ExcpRefNum )
- CloseResFile( excpRef );
- HUnlock( theSpeech );
- DisposHandle( theSpeech );
- }
-
-
- void SpeechRate( theSpeech, theRate )
- SpeechHandle theSpeech;
- int theRate;
- {
- register iSpeechPtr isp;
-
-
- HLock( theSpeech );
- isp = *( iSpeechHandle )theSpeech;
- isp->pb.u.cp.csRefNum = isp->DrvrRefNum;
- isp->pb.u.cp.csCode = RATE_CODE;
- isp->pb.u.cp.csParam.conCtl.sg_flags = theRate;
- PBCntli( isp );
- HUnlock( theSpeech );
- }
-
- void SpeechPitch( theSpeech, thePitch, theMode )
- SpeechHandle theSpeech;
- int thePitch;
- FOMode theMode;
- {
- register iSpeechPtr isp;
-
-
- HLock( theSpeech );
- isp = *( iSpeechHandle )theSpeech;
- isp->pb.u.cp.csRefNum = isp->DrvrRefNum;
- isp->pb.u.cp.csCode = MODE_CODE;
- isp->pb.u.cp.csParam.conCtl.sg_flags = theMode;
- PBCntli( isp );
- isp->pb.u.cp.csCode = PITCH_CODE;
- isp->pb.u.cp.csParam.conCtl.sg_flags = thePitch;
- PBCntli( isp );
- HUnlock( theSpeech );
-
- }
-
-
- void SpeechSex( theSpeech, theSex )
- SpeechHandle theSpeech;
- Sex theSex;
- {
- register iSpeechPtr isp;
-
-
- HLock( theSpeech );
- isp = *( iSpeechHandle )theSpeech;
- isp->pb.u.cp.csRefNum = isp->DrvrRefNum;
- isp->pb.u.cp.csCode = SEX_CODE;
- isp->pb.u.cp.csParam.conCtl.sg_flags = theSex;
- PBCntli( isp );
- HUnlock( theSpeech );
-
- }
-
-
- SpeechErr Reader( theSpeech, EnglishInput, InputLength, PhoneticOutput )
- SpeechHandle theSpeech;
- Ptr EnglishInput;
- long InputLength;
- Handle PhoneticOutput;
- {
- register iSpeechPtr isp;
- register ProcPtr * rdr;
- pascal SpeechErr DummyReader();
-
-
- HLock( theSpeech );
- isp = *( iSpeechHandle )theSpeech;
- rdr = isp->rdrHandle;
- HLock( rdr );
- return DummyReader( EnglishInput, InputLength, PhoneticOutput, *rdr );
- }
-
- #asm
- DummyRea_:
- move.l 4(sp),a0 ; a0 <- RealReader
- move.l (sp)+,(sp) ; RealReader spot <- ret address
- jmp (a0) ; Branch to real reader
- #endasm
-
-
-
- SpeechErr MacinTalk( theSpeech, Phonemes )
- SpeechHandle theSpeech;
- Handle Phonemes;
- {
- register Size PhonemeSize;
- register iSpeechPtr isp;
- register OSErr err;
-
- HLock( theSpeech );
- PhonemeSize = GetHandleSIze( Phonemes );
- isp = *( iSpeechHandle )theSpeech;
- isp->pb.u.iop.ioRefNum = isp->DrvrRefNum;
- isp->pb.u.iop.ioBuffer = Phonemes;
- isp->pb.u.iop.ioReqCount = PhonemeSize;
- err = PBWritei( isp );
- HUnlock( theSpeech );
- return err;
- }
-
- #asm
- PBClosei_:
- move.l 4(sp),a0 ; isp -> a0
- dc.w $a201 ; _Close, Immed
- rts
-
- PBWritei_:
- move.l 4(sp),a0 ; isp -> a0
- dc.w $a203 ; _Write, Immed
- rts
-
- PBCntli_:
- move.l 4(sp),a0 ; isp -> a0
- dc.w $a204 ; _Control, Immed
- rts
- #endasm
-